package thread;

/**
 * 使用当前类演示多线程并发的安全问题
 *
 * 当多个线程并发操作同一临界资源，由于线程切换时机不确定，导致执行顺序出现混乱
 * 从而产生不良后果
 */
public class Bank {
    private int account=20000;//银行账号上有20000

    //取钱的方法
    public synchronized boolean getMoney(int money){
        //查询账号余额
        int account = getAccount();
        //判断余额是否充足
        if(account>=money){
            account = account - money;//计算取款后的新余额
            Thread.yield();//主动让线程
            saveAccount(account);//记录新的余额
            return true;//允许出钞
        }
        return false;//拒绝出钞
    }
    //获取账号余额
    public int getAccount(){
        return account;
    }
    public void saveAccount(int account){
        this.account = account;
    }
}
